package object;

/**
 * 1. 子类无法继承父类的构造方法
 * 2. 子类可以继承父类的所有成员变量，私有，非私有变量都可以继承，但是非私有无法直接使用，需要使用get，set方法包裹一下使用
 * 3. 子类可以继承父类的非私有方法，无法继承私有方法
 */

/**
 * 继承中成员变量的访问特点：就近原则，谁离我近就用谁
 * 先在局部找，本类成员位置找，父类成员位置找，逐级往上
 */

/**
 * 继承中成员方法的特点：
 * this 调用，就近原则
 * super 调用，直接找父类
 * @Override
 * 重写父类的方法，重写的方法名称，形参列表必须同父类一致，简单来说，父类怎么写，子类就怎么写，加上注解就完了
 * 注意，只可以重写从父类上继承下来的方法，父类定义的方法被private static 或 final 修饰，那么就无法继承，所以就无法重写
 */

/**
 * 1. 子类不能继承父类的构造方法，但是可以通过super调用
 * 2. 子类构造方法的第一行，有一个默认的super
 * 3. 默认先执行父类的无参构造，再去执行子类的无参构造
 * 4. 如果想调用父类的有参构造,子类就要显式调用super方法，并传参，这个参数看父类需要什么，就传递什么
 */

/**
 * this 代表一个变量，表示当前方法调用者的地址值，也就是代表调用者那个对象
 */

class Parent {
	private int id;
	private String name;
	private int age;
	public String phone = "Samsung";

	public Parent() {
	}

	public Parent(int id, String name, int age) {
	}

	/**
	 * 子类只能访问父类非私有的成员，如果一个方法被private修饰，那么这个方法无法被继承
	 */
	public void parentMethod() {
		System.out.println("parent method");
	}

	public void run() {
		System.out.println("parent run");
	}

}

class Child extends Parent {
	public String phone = "Iphone";

	public Child() {
		super(1, "jason", 18);
	}

	public Child(int id, String name, int age) {
		super(id, name, age);
	}

	public void childMethod() {
		// System.out.println("child method");
		this.run();
		super.run();
	}

	// 重写
	@Override
	public void run() {
		System.out.println("child run");
	}

	public void showPhone() {
		// 继承中成员变脸的访问特点：就近原则，谁离我近就用谁
		String phone = "xiaomi";
		System.out.println(phone);
		System.out.println(this.phone); // this代表当前类，所以去找当前类的成员的变量，不会在当前方法找，如果当前类没有，他就会往上去父类找
		System.out.println(super.phone); // super代表父类，所以去找父类中的成员变量，这里只可以找到父类中被public修饰的变量
	}
}


public class ExtendClass extends Parent {
	public static void main(String[] args) {
		Child c1 = new Child();
		c1.showPhone();
		c1.childMethod();
	}
}
